<?php

namespace backend\controllers;


use backend\models\Admin;
use backend\models\EveryIsOk;
use backend\models\LoginForm;
use backend\models\SignupForm;
use yii\captcha\Captcha;
use yii\captcha\CaptchaAction;
use yii\data\Pagination;
use yii\filters\AccessControl;
use yii\filters\VerbFilter;
use yii\helpers\ArrayHelper;
use yii\helpers\Html;
use yii\helpers\Url;
use yii\helpers\VarDumper;
use yii\web\BadRequestHttpException;


class ManagerController extends \yii\web\Controller
{

    public function behaviors()
    {
        return [
            'access'=>[
                'class'=>'backend\filter\AccessFilter',
                'only' => ['list','test','signup'],
            ],
            'acf'=>[
                //通过ACF简单存取过滤器实现授权
                'class'=>AccessControl::className(),
                //授权的操作 登录,注册和注销
                'only'=>['logout','login','captcha',],
                'rules'=>[
                    [
                        //：指定该规则用于匹配哪些动作。 它的值应该是动作方法的ID数组。
                        //匹配比较是大小写敏感的。如果该选项为空，或者不使用该选项， 意味着当前规则适用于所有的动作
                        'actions'=>['login','captcha',],//值应该是动作方法的ID数组
                        //controllers：指定该规则用于匹配哪些控制器。 它的值应为控制器ID数组。
                        //匹配比较是大小写敏感的。如果该选项为空，或者不使用该选项， 则意味着当前规则适用于所有的动作。（译者注：这个选项一般是在控制器的自定义父类中使用才有意义
                        'allow'=>true,
                        /** 指定该规则用于匹配哪些用户角色。 系统自带两个特殊的角色，通过 yii\web\User::isGuest 来判断：

                        ?： 用于匹配访客用户 （未经认证）
                        @： 用于匹配已认证用户
                        使用其他角色名时，将触发调用 yii\web\User::can()，这时要求 RBAC 的支持 。
                         * 如果该选项为空或者不使用该选项，意味着该规则适用于所有角色。 */
                        'roles'=>[],
                        /** ips：指定该规则用于匹配哪些 yii\web\Request::userIP 。
                         * IP 地址可在其末尾包含通配符 * 以匹配一批前缀相同的IP地址。
                         * 例如，192.168.* 匹配所有 192.168. 段的IP地址。
                         * 如果该选项为空或者不使用该选项，意味着该规则适用于所有角色。 */
                       // 'ips'=>['127.0.*'],
                        //限制请求方式
                        'verbs'=>['get','post'],
                    ],
                    [
                        //拥有注册和注销以及访问验证码的权限
                        'actions'=>['logout','captcha'],
                        'allow'=>true,
                        'roles'=>['@'],
                    ],
                    [
                        //verbs：指定该规则用于匹配哪种请求方法（例如GET，POST）。 这里的匹配大小写不敏感。
                        //matchCallback：指定一个PHP回调函数用于 判定该规则是否满足条件。（译者注：此处的回调函数是匿名函数）

                    ],
                   /* [
                        'actions' => ['test'],
                        'allow' => true,
                        'matchCallback' => function ($rule, $action) {
                            return true;
                        }
                    ],*/
                ],
                //定制用户访问未授权操作是的处理方式
                'denyCallback' => function ($rule, $action) {
                    //return 'You are not allowed to access this page';
                    if(\Yii::$app->user->isGuest){
                        return $this->redirect(['manager/login']);
                    }

                    throw new \Exception('You are not allowed to access this page'.date('s'),304);
                 }
            ],
            /*'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'logout' => ['post'],
                ],
            ],*/
        ];
    }

    public function actions()
    {
        return [
            'captcha'=>[
                'class'=>CaptchaAction::className(),
                'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
                //'backColor'=>0x000000,//背景颜色
                'maxLength' => 6, //最大显示个数
                'minLength' => 5,//最少显示个数
                'height'=>40,//验证码字体的高度
                //'width' => 130,  //宽度
                //'foreColor'=>0xffffff,     //字体颜色
                'offset'=>5, //验证码字母间距
            ]
        ];
    }

    public function actionIndex()
    {
        return $this->render('index');
    }

    /*
     * 实现用户的登录
     */
    public function actionLogin()
    {

        //实例化表单模型
        $model = new LoginForm();
        //加载数据
        if($model->load(\Yii::$app->request->post())){
            //调用方法实现登录 //判断是否登录成功
            if($model->LoginCheck()){
                \Yii::$app->session->setFlash('success','登录成功!');

                return $this->redirect(Url::home(true));
            }
        }

        //显示登录的视图页面
        return $this->render('login',['model'=>$model]);
    }
    /*
    * 注销
    */
    public function actionLogout(){
        //注销
        $rs = \Yii::$app->user->logout();
        //提示
        \backend\models\EveryIsOk::setTisiInfo($rs,'注销');
        //跳转
        return $this->redirect(Url::home());
    }

    /*
     * 实现用户的添加注册
     */
    public function actionSignup()
    {
        //实例化表单模型
        $model = new SignupForm();
        //加载数据
        if($model->load(\Yii::$app->request->post())){
            //调用表单模型上的方法验证数据并且保存
            $adminModel = $model->signup();
            if($adminModel){
                //如果注册成功自动登录
                \Yii::$app->user->login(Admin::findIdentity($adminModel->id));

                \Yii::$app->session->setFlash('success','注册成功!');
                //跳转到首页
                return $this->redirect(Url::home(true));
            }
        }

        //显示视图
        return $this->render('signup',['model'=>$model]);
    }

    public function actionTest()
    {
        $user= \Yii::$app->user;

        $authmanager = \Yii::$app->authManager;

        //VarDumper::dump($authmanager,10,true);

        var_dump(\Yii::$app->controller->action);


        //var_dump($user);
        echo "是否是游客?";
        var_dump(\Yii::$app->user->isGuest);
    }

    /*
     * 用户的删除(实现用户的逻辑删除)
     */
    public function actionDel($id){
        $rs =  \Yii::$app->db->createCommand()->update('admin',['status'=>0],['id'=>$id])->execute();
        //提示
        \backend\models\EveryIsOk::setTisiInfo($rs,'删除');

        return $this->redirect(['manager/list']);

    }


    /*
     * 用户的修改(修改用户信息)
     */
    public function actionEdit($id){
        $auth = \Yii::$app->authManager;
        //获取当前用户的角色
        $roles = $auth->getRolesByUser($id);

        //实例化表单模型
        $model = Admin::findOne(['id'=>$id]);
        //把用户的角色赋值给用户的模型中
        $model->userRoles = ArrayHelper::getColumn($roles,'description');
        //加载并且验证用户提交的俄数据
        if($model->load(\Yii::$app->request->post()) && $model->validate()){
            //验证成功后保存数据
            if($model->save()){
                //更新用户的角色信息

                if($model->userRoles){
                    //删除之前的角色
                    $auth->revokeAll($model->id);
                    foreach($model->userRoles as $role){
                        $auth->assign($auth->getRole($role),$model->id);
                    }
                }

                //保存成功后跳转到列表页
                return $this->redirect(['manager/list']);
            }
        }

        //显示视图
        return $this->render('edit',['model'=>$model]);
    }


    /**
     * @param int $id
     * @return string
     */
    public function actionRequestPasswordReset($id=6)
    {
        //实例化表单模型
        $model = Admin::findOne(['id'=>$id]);
        //加载数据
        if($model->load(\Yii::$app->request->post())){
            //调用表单模型上的方法验证数据并且保存

        }

        //显示视图
        return $this->render('reset',['model'=>$model]);
    }

    /*
     * 用户的列表显示
     */
    public function actionList()
    {
        //实例化表单模型
        $query = Admin::find();
        //条件
        $condition = ['!=','status','0'];

        $query->where($condition);

        $pager = EveryIsOk::getPager($query);
        //获取当前页码的数据
        $models = $query->limit($pager->limit)->offset($pager->offset)->all();
        //显示视图
        return $this->render('list',['models'=>$models,'pager'=>$pager]);
    }

    /*
     * 显示管理员的回收站
     */
    public function actionRecycleBin(){
        //获取所有的删除的数据
        $query = Admin::find()->where(['=','status',0]);
        //获取分页对象
        $pager = EveryIsOk::getPager($query);
        //获取当前页码的数据
        $model = $query->limit($pager->limit)->offset($pager->offset)->all();
        //显示视图
        return $this->render('recycleBin',['models'=>$model,'pager'=>$pager]);
    }

    /*
     * 恢复逻辑删除的管理员
     */
    public function actionRecovery($id)
    {
        //把对应的数据中的状态值更新为1
        $rs = \Yii::$app->db->createCommand()->update('admin',['status'=>1],['id'=>$id])->execute();
        //执行成功后提示用户并且,跳转到列表页
        if($rs){
            \Yii::$app->session->setFlash('success','恢复成功!');
        }else{
            \Yii::$app->session->setFlash('success','恢复失败!');
        }

        return $this->redirect(['manager/list']);
    }


    /*
   * 实现商品的彻底删除
   */
    public function actionDelete($id){
        //删除数据
        $rs = \Yii::$app->db->createCommand()->delete('admin',['id'=>$id,'status'=>0])->execute();

        if($rs){
            //彻底删除用户之前撤销角色的关联
            $auth =\Yii::$app->authManager;
            $auth->revokeAll($id);
        }
        //提示信息
        EveryIsOk::setTisiInfo($rs,'彻底删除管理员');
        //跳转
        return $this->redirect(['manager/recycle-bin']);

    }




}
